{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**通用最佳实践回顾**\n",
    "\n",
    "- `std::mdspan<T, Extents, LayoutPolicy, AccessorPolicy>`（C++23）为多维数组提供**非拥有视图**，可将裸指针或容器数据映射到矩阵/张量等维度，消除显式索引换算与手写跨度（stride）。\n",
    "- `mdspan` 不管理内存生命周期；确保底层缓冲在视图存活期间有效，并与指定布局/跨度匹配，否则行为未定义。\n",
    "- `std::extents` 支持静态（编译期）与动态（运行期）维度混合，动态维度以 `std::dynamic_extent` 标注；尽量将常用维度设为静态以利于编译器优化。\n",
    "- 选用合适的 `LayoutPolicy`：`std::layout_right`（行优先）、`std::layout_left`（列优先）、`std::layout_stride`（自定义跨度）。合理布局有助于缓存亲和、SIMD、GPU 共用内存。\n",
    "- 对齐与跨度需与底层分配方式一致；在 GPU/异构内存或行对齐场景，通常需使用 `std::layout_stride` 或自定义 accessor 以封装 pitch、bank 对齐规则。\n",
    "- accessor 可封装读写策略（如只读视图、dry-run 视图、设备内存访问器）；在 HPC/科学计算库中可通过 accessor 实现后端无关数据访问。\n",
    "- `mdspan` 支持 `submdspan`（在 `<mdspan>` 中以自由函数提供）以构造子视图，适合卷积/图像裁剪等局部操作；索引边界不做检查，可配合 `std::experimental::mdspan` 的 `layout_stride`/`submdspan` 版本或自建包装提供调试期检查。\n",
    "- 保持接口泛型：让算法接受 `mdspan` 而非特定容器，增强可复用性并减少数据搬运；传参可使用 `auto` 或模板化类型别名结合 `requires` 约束 rank/元素类型。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**附加建议**\n",
    "\n",
    "- 在跨平台项目中使用 `std::mdspan` 前，确认编译器实现状态；必要时利用 `#ifdef` 在 `<mdspan>` 与 `<experimental/mdspan>` 间切换。\n",
    "- 对性能敏感路径，配合 `noexcept`, `[[likely]]`, `restrict` 属性（如编译器扩展）进一步提示优化器；考虑启用 `-fexperimental-library`（libstdc++）或 `-std=c++2b` 等选项以获取最新实现。\n",
    "- 在调试期可封装安全访问器（界限检查），运行期切换为默认访问器，以兼顾安全与性能。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| 序号 | 工程场景                          | 文件名                         | 说明要点                                                     | 可运行示例代码       |\n",
    "| ---- | --------------------------------- | ------------------------------ | ------------------------------------------------------------ | -------------------- |\n",
    "| 1    | 数值/HPC：矩阵/张量/卷积          | `mdspan_matrix_multiply.cpp`   | 行主序矩阵乘法，演示 `std::extents` 动态维度、`layout_right` 与 `submdspan` 组合。 | 示例 1：矩阵乘法     |\n",
    "| 2    | 图像处理（行/列/步幅、平面/通道） | `mdspan_image_pitch.cpp`       | RGB 图像带行步幅（pitch）的视图，展示 `layout_stride` 和通道访问。 | 示例 2：图像步幅视图 |\n",
    "| 3    | GPU/异构内存（行对齐/跨距布局）   | `mdspan_gpu_pitch_adapter.cpp` | 模拟 GPU pitch 分配，使用 `layout_stride` 和自定义只读 accessor 封装设备指针。 | 示例 3：GPU 跨距映射 |\n",
    "| 4    | 科学计算库后端无关数据访问        | `mdspan_backend_agnostic.cpp`  | 泛型张量算子接受任意 `mdspan`，通过概念检查 rank，展示与 `std::vector`/自定义缓冲共用接口。 | 示例 4：后端无关访问 |\n",
    "\n",
    "提示：若编译器尚未提供 <mdspan> 正式头，可包含 <experimental/mdspan> 并在命名空间 std::experimental 下使用。以下示例假设使用 C++23 <mdspan>。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 示例 1：矩阵乘法（mdspan_matrix_multiply.cpp）\n",
    "- 示例 2：图像步幅视图（mdspan_image_pitch.cpp）\n",
    "- 示例 3：GPU 跨距映射（mdspan_gpu_pitch_adapter.cpp）\n",
    "- 示例 4：后端无关访问（mdspan_backend_agnostic.cpp）"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
